<?php
@ini_set ( 'zend.ze1_compatibility_mode', 0 );

function domxml_new_doc($version) {
	return new php4DOMDocument ( '' );
}

function domxml_open_file($filename) {
	return new php4DOMDocument ( $filename );
}

function domxml_open_mem($str) {
	$dom = new php4DOMDocument ( '' );
	$dom->myDOMNode->loadXML ( $str );
	
	return $dom;
}

function xpath_eval($xpath_context, $eval_str, $contextnode = null) {
	return $xpath_context->xpath_eval ( $eval_str, $contextnode );
}

function xpath_new_context($dom_document) {
	return new php4DOMXPath ( $dom_document );
}

function xpath_register_ns($xpath_context, $prefix, $namespaceURI) {
	return $xpath_context->myDOMXPath->registerNamespace ( $prefix, $namespaceURI );
}

class php4DOMAttr extends php4DOMNode {
	
	function php4DOMAttr($aDOMAttr) {
		$this->myDOMNode = $aDOMAttr;
	}
	
	function __get($name) {
		if ($name == 'name')
			return $this->myDOMNode->name;
		elseif ($name == 'value')
			return $this->myDOMNode->value;
		
		return parent::__get ( $name );
	}
	
	function name() {
		return $this->myDOMNode->name;
	}
	
	function set_value($content) {
		return $this->myDOMNode->value = $content;
	}
	
	function specified() {
		return $this->myDOMNode->specified;
	}
	
	function value() {
		return $this->myDOMNode->value;
	}
}

class php4DOMDocument extends php4DOMNode {
	function php4DOMDocument($filename = '') {
		$this->myDOMNode = new DOMDocument ();
		$this->myOwnerDocument = $this;
		
		if ($filename != '')
			$this->myDOMNode->load ( $filename );
	}
	
	function add_root($name) {
		if ($this->myDOMNode->hasChildNodes ())
			$this->myDOMNode->removeChild ( $this->myDOMNode->firstChild );
		
		return new php4DOMElement ( $this->myDOMNode->appendChild ( $this->myDOMNode->createElement ( $name ) ), $this->myOwnerDocument );
	}
	
	function create_attribute($name, $value) {
		$myAttr = $this->myDOMNode->createAttribute ( $name );
		$myAttr->value = $value;
		return new php4DOMAttr ( $myAttr, $this );
	}
	
	function create_cdata_section($content) {
		return new php4DOMNode ( $this->myDOMNode->createCDATASection ( $content ), $this );
	}
	
	function create_comment($data) {
		return new php4DOMNode ( $this->myDOMNode->createComment ( $data ), $this );
	}
	
	function create_element($name) {
		return new php4DOMElement ( $this->myDOMNode->createElement ( $name ), $this );
	}
	
	function create_text_node($content) {
		return new php4DOMNode ( $this->myDOMNode->createTextNode ( $content ), $this );
	}
	
	function document_element() {
		return $this->_newDOMElement ( $this->myDOMNode->documentElement, $this );
	}
	
	function dump_file($filename, $compressionmode = false, $format = false) {
		$format0 = $this->myDOMNode->formatOutput;
		$this->myDOMNode->formatOutput = $format;
		$res = $this->myDOMNode->save ( $filename );
		$this->myDOMNode->formatOutput = $format0;
		
		return $res;
	}
	
	function dump_mem($format = false, $encoding = false) {
		$format0 = $this->myDOMNode->formatOutput;
		$this->myDOMNode->formatOutput = $format;
		$encoding0 = $this->myDOMNode->encoding;
		
		if ($encoding)
			$this->myDOMNode->encoding = $encoding;
		
		$dump = $this->myDOMNode->saveXML ();
		$this->myDOMNode->formatOutput = $format0;
		
		if ($encoding)
			$this->myDOMNode->encoding = $encoding0 == '' ? 'UTF-8' : $encoding0; // UTF-8
				                                                                      // est
				                                                                      // l'encodage
				                                                                      // XML
			                                                                      // par
				                                                                      // defaut
		
		return $dump;
	}
	
	function dump_node($node = null) {
		return $this->myDOMNode->saveXML ( $node->myDOMNode );
	}
	
	function free() {
		if ($this->myDOMNode->hasChildNodes ())
			$this->myDOMNode->removeChild ( $this->myDOMNode->firstChild );
		
		$this->myDOMNode = null;
		$this->myOwnerDocument = null;
	}
	
	function get_element_by_id($id) {
		return $this->_newDOMElement ( $this->myDOMNode->getElementById ( $id ), $this );
	}
	
	function get_elements_by_tagname($name) {
		$myDOMNodeList = $this->myDOMNode->getElementsByTagName ( $name );
		$nodeSet = array ();
		$i = 0;
		
		if (isset ( $myDOMNodeList ))
			while ( ($node = $myDOMNodeList->item ( $i )) != false ) {
				$nodeSet [] = new php4DOMElement ( $node, $this );
				$i ++;
			}
		
		return $nodeSet;
	}
	
	function html_dump_mem() {
		return $this->myDOMNode->saveHTML ();
	}
	
	function root() {
		return $this->_newDOMElement ( $this->myDOMNode->documentElement, $this );
	}
	
	function xpath_new_context() {
		return new php4DOMXPath ( $this );
	}
}

class php4DOMElement extends php4DOMNode {
	function get_attribute($name) {
		return $this->myDOMNode->getAttribute ( $name );
	}
	
	function get_elements_by_tagname($name) {
		$myDOMNodeList = $this->myDOMNode->getElementsByTagName ( $name );
		$nodeSet = array ();
		$i = 0;
		
		if (isset ( $myDOMNodeList ))
			while ( ($node = $myDOMNodeList->item ( $i )) != false ) {
				$nodeSet [] = new php4DOMElement ( $node, $this->myOwnerDocument );
				$i ++;
			}
		
		return $nodeSet;
	}
	
	function has_attribute($name) {
		return $this->myDOMNode->hasAttribute ( $name );
	}
	
	function remove_attribute($name) {
		return $this->myDOMNode->removeAttribute ( $name );
	}
	
	function set_attribute($name, $value) {
		return $this->myDOMNode->setAttribute ( $name, $value );
	}
	
	function tagname() {
		return $this->myDOMNode->tagName;
	}
}

class php4DOMNode {
	var $myDOMNode;
	var $myOwnerDocument;
	
	function php4DOMNode($aDomNode, $aOwnerDocument) {
		$this->myDOMNode = $aDomNode;
		$this->myOwnerDocument = $aOwnerDocument;
	}
	
	function __get($name) {
		
		if ($name == 'type')
			return $this->myDOMNode->nodeType;
		elseif ($name == 'tagname')
			return $this->myDOMNode->tagName;
		elseif ($name == 'content')
			return $this->myDOMNode->textContent;
		else {
			$myErrors = debug_backtrace ();
			trigger_error ( 'Undefined property: ' . get_class ( $this ) . '::$' . $name . ' [' . $myErrors [0] ['file'] . ':' . $myErrors [0] ['line'] . ']', E_USER_NOTICE );
			
			return false;
		}
	}
	
	function append_child($newnode) {
		return new php4DOMElement ( $this->myDOMNode->appendChild ( $this->_importNode ( $newnode ) ), $this->myOwnerDocument );
	}
	
	function append_sibling($newnode) {
		return new php4DOMElement ( $this->myDOMNode->parentNode->appendChild ( $this->_importNode ( $newnode ) ), $this->myOwnerDocument );
	}
	
	function attributes() {
		$myDOMNodeList = $this->myDOMNode->attributes;
		$nodeSet = array ();
		$i = 0;
		
		if (isset ( $myDOMNodeList ))
			while ( ($node = $myDOMNodeList->item ( $i )) != false ) {
				$nodeSet [] = new php4DOMAttr ( $node, $this->myOwnerDocument );
				$i ++;
			}
		
		return $nodeSet;
	}
	
	function child_nodes() {
		$myDOMNodeList = $this->myDOMNode->childNodes;
		$nodeSet = array ();
		$i = 0;
		
		if (isset ( $myDOMNodeList ))
			while ( ($node = $myDOMNodeList->item ( $i )) != false ) {
				$nodeSet [] = new php4DOMElement ( $node, $this->myOwnerDocument );
				$i ++;
			}
		
		return $nodeSet;
	}
	
	function children() {
		return $this->child_nodes ();
	}
	
	function clone_node($deep = false) {
		return new php4DOMElement ( $this->myDOMNode->cloneNode ( $deep ), $this->myOwnerDocument );
	}
	
	function unlink_node() {
		return $this->myDOMNode->parentNode->removeChild ( $this->myDOMNode );
	}
	
	function dump_node($node = null) {
		return $this->myOwnerDocument->myDOMNode->saveXML ( $this->myDOMNode );
	}
	
	function first_child() {
		return $this->_newDOMElement ( $this->myDOMNode->firstChild, $this->myOwnerDocument );
	}
	
	function get_content() {
		return $this->myDOMNode->textContent;
	}
	
	function has_attributes() {
		return $this->myDOMNode->hasAttributes ();
	}
	
	function has_child_nodes() {
		return $this->myDOMNode->hasChildNodes ();
	}
	
	function insert_before($newnode, $refnode) {
		return new php4DOMElement ( $this->myDOMNode->insertBefore ( $newnode->myDOMNode, $refnode->myDOMNode ), $this->myOwnerDocument );
	}
	
	function is_blank_node() {
		return ($this->myDOMNode->nodeType == XML_TEXT_NODE) && ereg ( '^([[:cntrl:]]|[[:space:]])*$', $this->myDOMNode->nodeValue );
	}
	
	function last_child() {
		return $this->_newDOMElement ( $this->myDOMNode->lastChild, $this->myOwnerDocument );
	}
	
	function new_child($name, $content) {
		$mySubNode = $this->myDOMNode->ownerDocument->createElement ( $name );
		$mySubNode->appendChild ( $this->myDOMNode->ownerDocument->createTextNode ( html_entity_decode ( $content, ENT_QUOTES ) ) );
		$this->myDOMNode->appendChild ( $mySubNode );
		
		return new php4DOMElement ( $mySubNode, $this->myOwnerDocument );
	}
	
	function next_sibling() {
		return $this->_newDOMElement ( $this->myDOMNode->nextSibling, $this->myOwnerDocument );
	}
	
	function node_name() {
		if ($this->myDOMNode->nodeType == XML_ELEMENT_NODE)
			return $this->myDOMNode->localName; // evite prefixe espace de nom
		else
			return $this->myDOMNode->nodeName;
	}
	
	function node_type() {
		return $this->myDOMNode->nodeType;
	}
	
	function node_value() {
		return $this->myDOMNode->nodeValue;
	}
	
	function owner_document() {
		return $this->myOwnerDocument;
	}
	
	function parent_node() {
		return $this->_newDOMElement ( $this->myDOMNode->parentNode, $this->myOwnerDocument );
	}
	
	function prefix() {
		return $this->myDOMNode->prefix;
	}
	
	function previous_sibling() {
		return $this->_newDOMElement ( $this->myDOMNode->previousSibling, $this->myOwnerDocument );
	}
	
	function remove_child($oldchild) {
		return $this->_newDOMElement ( $this->myDOMNode->removeChild ( $oldchild->myDOMNode ), $this->myOwnerDocument );
	}
	
	function replace_child($oldnode, $newnode) {
		return $this->_newDOMElement ( $this->myDOMNode->replaceChild ( $oldnode->myDOMNode, $this->_importNode ( $newnode ) ), $this->myOwnerDocument );
	}
	
	function set_content($text) {
		return $this->myDOMNode->appendChild ( $this->myDOMNode->ownerDocument->createTextNode ( $text ) );
	}
	
	function _importNode($newnode) { // Fonction privee pour importer un DOMNode
	                                 // d'un autre DOMDocument
		if ($this->myOwnerDocument === $newnode->myOwnerDocument)
			return $newnode->myDOMNode;
		else
			return $this->myOwnerDocument->myDOMNode->importNode ( $newnode->myDOMNode, true );
	}
	
	function _newDOMElement($aDOMNode, $aOwnerDocument) { // Fonction privee pour
	                                                      // verifier le DOMNode
	                                                      // PHP5 avant d'y
	                                                      // associer une
	                                                      // enveloppe DOMNode
	                                                      // PHP4
		if ($aDOMNode == null)
			return null;
		elseif ($aDOMNode->nodeType == XML_ELEMENT_NODE)
			return new php4DOMElement ( $aDOMNode, $aOwnerDocument );
		elseif ($aDOMNode->nodeType == XML_ATTRIBUTE_NODE)
			return new php4DOMAttr ( $aDOMNode, $aOwnerDocument );
		else
			return new php4DOMNode ( $aDOMNode, $aOwnerDocument );
	}
}

class php4DOMNodelist {
	var $myDOMNodelist;
	var $nodeset;
	
	function php4DOMNodelist($aDOMNodelist, $aOwnerDocument) {
		$this->myDOMNodelist = $aDOMNodelist;
		$this->nodeset = array ();
		$i = 0;
		
		if (isset ( $this->myDOMNodelist ))
			while ( ($node = $this->myDOMNodelist->item ( $i )) != false ) {
				switch ($node->nodeType) {
					case XML_ATTRIBUTE_NODE :
						$this->nodeset [] = new php4DOMAttr ( $node, $aOwnerDocument );
						break;
					
					case XML_ELEMENT_NODE :
					default :
						$this->nodeset [] = new php4DOMElement ( $node, $aOwnerDocument );
				}
				
				$i ++;
			}
	}
}

class php4DOMXPath {
	var $myDOMXPath;
	var $myOwnerDocument;
	
	function php4DOMXPath($dom_document) {
		$this->myOwnerDocument = $dom_document;
		$this->myDOMXPath = new DOMXPath ( $dom_document->myDOMNode );
	}
	
	function xpath_eval($eval_str, $contextnode = null) {
		if (isset ( $contextnode ))
			return new php4DOMNodelist ( $this->myDOMXPath->query ( $eval_str, $contextnode->myDOMNode ), $this->myOwnerDocument );
		else
			return new php4DOMNodelist ( $this->myDOMXPath->query ( $eval_str ), $this->myOwnerDocument );
	}
	
	function xpath_register_ns($prefix, $namespaceURI) {
		return $this->myDOMXPath->registerNamespace ( $prefix, $namespaceURI );
	}
}

if (extension_loaded ( 'xsl' )) { // Voir aussi :
                                  // http://alexandre.alapetite.net/doc-alex/xslt-php4-php5/
	
	function domxml_xslt_stylesheet($xslstring) {
		return new php4DomXsltStylesheet ( DOMDocument::loadXML ( $xslstring ) );
	}
	
	function domxml_xslt_stylesheet_doc($dom_document) {
		return new php4DomXsltStylesheet ( $dom_document );
	}
	
	function domxml_xslt_stylesheet_file($xslfile) {
		return new php4DomXsltStylesheet ( DOMDocument::load ( $xslfile ) );
	}
	
	class php4DomXsltStylesheet {
		var $myxsltProcessor;
		
		function php4DomXsltStylesheet($dom_document) {
			$this->myxsltProcessor = new xsltProcessor ();
			$this->myxsltProcessor->importStyleSheet ( $dom_document );
		}
		
		function process($dom_document, $xslt_parameters = array(), $param_is_xpath = false) {
			foreach ( $xslt_parameters as $param => $value )
				$this->myxsltProcessor->setParameter ( '', $param, $value );
			
			$myphp4DOMDocument = new php4DOMDocument ();
			$myphp4DOMDocument->myDOMNode = $this->myxsltProcessor->transformToDoc ( $dom_document->myDOMNode );
			
			return $myphp4DOMDocument;
		}
		
		function result_dump_file($dom_document, $filename) {
			$html = $dom_document->myDOMNode->saveHTML ();
			file_put_contents ( $filename, $html );
			
			return $html;
		}
		
		function result_dump_mem($dom_document) {
			return $dom_document->myDOMNode->saveHTML ();
		}
	}
}

?>